{# Voice > Models (overseer_ai_voice): one tight table on the canvas, narrowed by the filters with no request (``data-facets``): what the active profile uses, every speech, hearing and live model, every voice. A row plays on a model that speaks it (``speak_button``, one player at a time) and Use puts it on the profile. Below, a line said in a chosen voice and a file transcribed. #} {% from "components/macros/chat.html" import speak_button %} {% from "components/macros/form.html" import action, checklist, file_button, filter_input, primary_button %} {% from "components/macros/layout.html" import chart_dot %} {% from "pages/overseer/_macros.html" import rows_scroller %} {% set head = "px-3 py-1.5 text-left font-medium" %} {% set cell = "px-3 py-1 whitespace-nowrap truncate" %}
{{ checklist("ai-voice-kinds", "kind", "Kinds", kinds) }} {{ checklist("ai-voice-providers", "provider", "Providers", providers) }} {{ checklist("ai-voice-models", "model", "Models", models) }} {{ filter_input("#ai-voice-rows", "q", none, placeholder="Search voices and models") }}
{% call rows_scroller("overflow-y-auto") %} {% for row in rows %} {% endfor %}
KindProviderNameDetailsPlays onPrice / 1MActions
{{ row.label }} {{ chart_dot(row.color) }}{{ row.provider_name }} {{ row.name }} {{ row.detail }} {{ row.plays_on or "" }} {{ row.price or "" }} {%- if row.blocked %}{{ row.blocked }}{% endif -%} {%- if row.speak %}{{ speak_button(row.speak, "align-middle text-aegis-muted hover:text-aegis-text") }}{% endif -%} {%- if row.use %} {%- elif row.used and row.kind != "use" %}in use{% endif -%}
{% endcall %}
{# The voice API's preview route speaks any line; the player just points at it. #}
{{ action("Speak", "@click=\"src = $el.closest('[data-preview-base]').dataset.previewBase + voice + '?text=' + encodeURIComponent(text || 'Hello from the Overseer')\"") }}
{{ file_button("ai-voice-audio", "Choose audio", "audio/*", name="audio", submit=False) }} {{ primary_button("Transcribe", "submit") }}